#pragma once
#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <vector>

#include"Mutex.hpp"
#include "Inetaddr.hpp"
#include "Log.hpp"

using namespace LogModule;
using namespace MutexModule;

//
class Route
{
    bool IsExist(const InetAddr &ia)
    {
        for (auto &i : _online_user)
        {
            if (i == ia)
                return true;
        }
        return false;
    }

    void Adduser(const InetAddr &ia)
    {
        _online_user.push_back(ia);
        LOG(LogLevel::INFO) << "新增了一个用户：" << ia.StringAddr();
    }

    void DeleteUser(const InetAddr &ia)
    {
        for (auto iter = _online_user.begin(); iter != _online_user.end(); iter++)
        {
            if (*iter == ia)
            {
                _online_user.erase(iter);
                LOG(LogLevel::INFO) << "删除了一个用户：" << ia.StringAddr();
                return;
            }
        }
    }

public:
    Route()
    {
    }

    void Send(int fd, const std::string &message, const InetAddr &ia)
    {
        MutexGuard mgd(_mutex);
        if (!IsExist(ia))
        {
            Adduser(ia);
        }

        std::string mg = ia.StringAddr() + "#" + message;

        for (auto &user : _online_user)
        {
            sendto(fd, mg.c_str(), mg.size(), 0, (const sockaddr *)&user.Addr(), sizeof(user.Addr()));
        }

        if (message == "QUIT")
        {
            DeleteUser(ia);           
        }
    }
    ~Route()
    {
    }

private:
    std::vector<InetAddr> _online_user;
    Mutex _mutex;
};